package common

import "encoding/json"

// JsonMap 表示 JSON 对象的键值对映射。
type JsonMap map[string]interface{}

// Get 获取指定键的值。
func (js JsonMap) Get(key string) interface{} {
	return js[key]
}

// GetInt32 获取 int32 类型的值。
func (js JsonMap) GetInt32(key string) int32 {
	return int32(js.Get(key).(float64))
}

// GetInt32IfExist 获取 int32 类型的值，如果键不存在则返回 -1。
func (js JsonMap) GetInt32IfExist(key string) int32 {
	if node := js.Get(key); node != nil {
		return int32(node.(float64))
	} else {
		return -1
	}
}

// 返回float32类型
func (js JsonMap) GetFloat32(key string) float32 {
	return float32(js.Get(key).(float64))
}

// 返回uint16类型
func (js JsonMap) GetUInt16(key string) uint16 {
	return uint16(js.Get(key).(float64))
}

// 返回uint32类型
func (js JsonMap) GetUInt32(key string) uint32 {
	return uint32(js.Get(key).(float64))
}
func (js JsonMap) GetUInt64(key string) uint64 {
	return uint64(js.Get(key).(float64))
}

// 返回int64类型
func (js JsonMap) GetInt64(key string) int64 {
	return int64(js.Get(key).(float64))
}

// 返回int64类型，如果没有该字段就返回-1
func (js JsonMap) GetInt64IfExist(key string) int64 {
	if node := js.Get(key); node != nil {
		return int64(node.(float64))
	} else {
		return -1
	}
}

// 返回bool类型
func (js JsonMap) GetBool(key string) bool {
	if js.Get(key) == nil {
		return false
	}
	return js.Get(key).(bool)
}

// 返回string
func (js JsonMap) GetStringNode(key string) string {
	return js.Get(key).(string)
}

// 返回一个JsonArray
func (js JsonMap) GetArray(key string) JsonArray {
	v := js[key].([]interface{})
	return JsonArray(v)
}

// 返回一个JsonArray，错误返回空
func (js JsonMap) GetArrayIfExist(key string) JsonArray {
	if v, ok := js[key]; ok {
		if result, ok := v.([]interface{}); ok {
			return JsonArray(result)
		}
	}
	return JsonArray{}
}

// 返回一个JsonMap
func (js JsonMap) GetMap(key string) JsonMap {
	v := js[key].(map[string]interface{})
	return JsonMap(v)
}

// 返回[]int
func (js JsonMap) GetIntArray(key string) []int {
	return js.GetArray(key).GetIntArray()
}

// 返回 []int32
func (js JsonMap) GetInt32Array(key string) []int32 {
	var arr []int32
	for _, v := range js.GetArray(key) {
		arr = append(arr, int32(v.(float64)))
	}
	return arr
}

// 返回[]iny32
func (js JsonMap) GetInt32ArrayIfExist(key string) []int32 {
	var arr []int32
	for _, v := range js.GetArrayIfExist(key) {
		arr = append(arr, int32(v.(float64)))
	}
	return arr
}

func (js JsonMap) GetString(key string) *String {
	return NewStringAny(js[key])
}

type JsonArray []interface{}

func (js JsonArray) GetArray(index int) JsonArray {
	v := js[index].([]interface{})
	return JsonArray(v)
}

func (js JsonArray) GetMap(index int) JsonMap {
	v := js[index].(map[string]interface{})
	return JsonMap(v)
}

func (js JsonArray) GetIntArray() []int {
	result := make([]int, len(js))
	for i, v := range js {
		result[i] = NewStringAny(v).ToIntV()
	}
	return result
}
func (js JsonArray) GetStringArray() []string {
	result := make([]string, len(js))
	for i, v := range js {
		result[i] = NewStringAny(v).String()
	}
	return result
}
func (js JsonArray) GetString(index int) *String {
	return NewStringAny(js[index])
}

func (js JsonMap) Marshal() (dAtA []byte, err error) {
	return json.Marshal(js)
}
func (js JsonMap) MarshalTo(dAtA []byte) (int, error) {
	d, err := js.Marshal()
	if err != nil {
		return 0, err
	}
	return copy(dAtA, d), nil
}
func (js JsonMap) Unmarshal(dAtA []byte) error {
	return json.Unmarshal(dAtA, &js)
}
func (js JsonMap) Size() (n int) {
	jsonBytes, _ := js.Marshal()
	return len(jsonBytes)
}
func (js JsonMap) Name() string {
	return "JsonMap"
}
func (js JsonMap) Descriptor() ([]byte, []int) {
	return nil, nil
}
func (js JsonMap) Reset() {

}
func (js JsonMap) String() string {
	jsonBytes, _ := json.MarshalIndent(js, "", "  ")
	return string(jsonBytes)
}
func (js JsonMap) ProtoMessage() {

}
